#include <head.h>

/*
管道
pipe
`pipefd[0]` 是管道的读端
`pipefd[1]` 是管道的写端
*/
int main(int argc, char const *argv[])
{
    // 创建管道
    int p_fd_1[2]; // 一个管道只能单端通讯  如果想双端通讯 则可以建立两个管道
    int p_fd_2[2]; // 一个管道只能单端通讯  如果想双端通讯 则可以建立两个管道
    if (-1 == pipe(p_fd_1))
    {
        perror("p_fd_1 pipe error:");
        return -1;
    }
    if (-1 == pipe(p_fd_2))
    {
        perror("p_fd_2 pipe error:");
        return -1;
    }

    // 创建进程
    pid_t pid = 0;

    if (-1 == (pid = fork()))
    {
        perror("fork error:");
        return -1;
    }
    else if (0 < pid) // 父进程
    {

        close(p_fd_1[1]);    // 关闭 1 的写端
        close(p_fd_2[0]);    // 关闭 2 的读端
        char buf_read[128];  // 用于读取数据
        char buf_write[128]; // 用于写入数据
        while (1)
        {
            // 使用  管道 1 读取  管道2 写入
            memset( buf_read , 0 , sizeof(buf_read));
            memset( buf_write , 0 , sizeof(buf_write));

            // 父进程 写入
            strcpy(buf_write , "我是父进程");
            write( p_fd_2[1] , buf_write , strlen(buf_write) );

            // 父进程 读取
            read(p_fd_1[0] , buf_read , sizeof(buf_read));
            printf("父进程 接收到的信息: %s\n" , buf_read);
            sleep(2);
        }

        close(p_fd_1[0]); // 关闭 1 的读端
        close(p_fd_2[1]); // 关闭 2 的写端
    }
    else if (0 == pid)
    {

        close(p_fd_1[0]); // 关闭 1 的读端
        close(p_fd_2[1]); // 关闭 2 的写端
        char buf_read[128];  // 用于读取数据
        char buf_write[128]; // 用于写入数据
        while (1)
        {
            // 使用  管道 1 写入  管道2 读取
            memset( buf_read , 0 , sizeof(buf_read));
            memset( buf_write , 0 , sizeof(buf_write));

            // 子进程 发送
            strcpy(buf_write , "我是子进程");
            write( p_fd_1[1] , buf_write , strlen(buf_write) );

            // 父进程 读取
            read(p_fd_2[0] , buf_read , sizeof(buf_read));
            printf("子进程 接收到的信息: %s\n" , buf_read);
            sleep(2);
        }

        close(p_fd_1[1]); // 关闭 1 的写端
        close(p_fd_2[0]); // 关闭 2 的读端
    }

    return 0;
}
